/*  Written by FanLin  Reference to simple.flex & lcalc.flex*/
/*  Still need to be added some to specify COMMENT */ 

/* Usercode Section */

%%

/* Option and Declarations Section*/
%{
  /*  private int comment_count = 0;  (it can be used when COMMENT can be used >_<)   */
%}

%class Jitlexer
%line
%column
%unicode
%char
%debug
/* %state COMMENT  */

DIGIT=[0-9]
/*SYMBOL =+|-*/
INTEGER=(-)?(0|[1-9][0-9]*)+
ALPHA=[A-Za-z]
LINETERMINAL=\r|\n|\r\n
WHITESPACE={LINETERMINAL}|[ \t\f]
IDENTIFIER={ALPHA}({ALPHA}|{DIGIT}|_)*

%%

/* Lexical Rules Section */

<YYINITIAL>{
  "class"    { return (new Yytoken(0,yytext(),yyline,yychar,yychar+5)); }
  "public"   { return (new Yytoken(1,yytext(),yyline,yychar,yychar+6)); }
  "static"   { return (new Yytoken(2,yytext(),yyline,yychar,yychar+6)); }
  "void"     { return (new Yytoken(3,yytext(),yyline,yychar,yychar+4)); }
  "main"     { return (new Yytoken(4,yytext(),yyline,yychar,yychar+4)); }
  "String"   { return (new Yytoken(5,yytext(),yyline,yychar,yychar+6)); }
  "extends"  { return (new Yytoken(6,yytext(),yyline,yychar,yychar+7)); }
  "return"   { return (new Yytoken(7,yytext(),yyline,yychar,yychar+6)); }
  "int"      { return (new Yytoken(8,yytext(),yyline,yychar,yychar+3)); }
  "boolean"  { return (new Yytoken(9,yytext(),yyline,yychar,yychar+7)); }
  "if"       { return (new Yytoken(10,yytext(),yyline,yychar,yychar+2)); }
  "while"    { return (new Yytoken(11,yytext(),yyline,yychar,yychar+5)); }
  "true"     { return (new Yytoken(12,yytext(),yyline,yychar,yychar+4)); }
  "false"    { return (new Yytoken(13,yytext(),yyline,yychar,yychar+5)); }
  "this"     { return (new Yytoken(14,yytext(),yyline,yychar,yychar+4)); }
  "new"      { return (new Yytoken(15,yytext(),yyline,yychar,yychar+3)); }
  "else"		 { return (new Yytoken(16,yytext(),yyline,yychar,yychar+4)); }
  /* only appear in the MiniJava  from here to next comment*/
  
  "System" { return (new Yytoken(30,yytext(),yyline,yychar,yychar+6)); }
  "out" { return (new Yytoken(31,yytext(),yyline,yychar,yychar+3)); }
  "length" { return (new Yytoken(32,yytext(),yyline,yychar,yychar+6)); }
  /* stop here */
  
  ","  { return (new Yytoken(40,yytext(),yyline,yychar,yychar+1)); }
  ":"  { return (new Yytoken(41,yytext(),yyline,yychar,yychar+1)); }
  ";"  { return (new Yytoken(42,yytext(),yyline,yychar,yychar+1)); }
  "("  { return (new Yytoken(43,yytext(),yyline,yychar,yychar+1)); }
  ")"  { return (new Yytoken(44,yytext(),yyline,yychar,yychar+1)); }
  "["  { return (new Yytoken(45,yytext(),yyline,yychar,yychar+1)); }
  "]"  { return (new Yytoken(46,yytext(),yyline,yychar,yychar+1)); }
  "{"  { return (new Yytoken(47,yytext(),yyline,yychar,yychar+1)); }
  "}"  { return (new Yytoken(48,yytext(),yyline,yychar,yychar+1)); }
  "."  { return (new Yytoken(49,yytext(),yyline,yychar,yychar+1)); }
  "+"  { return (new Yytoken(50,yytext(),yyline,yychar,yychar+1)); }
  "-"  { return (new Yytoken(51,yytext(),yyline,yychar,yychar+1)); }
  "*"  { return (new Yytoken(52,yytext(),yyline,yychar,yychar+1)); }
  "="  { return (new Yytoken(53,yytext(),yyline,yychar,yychar+1)); }
  "&&" { return (new Yytoken(54,yytext(),yyline,yychar,yychar+2)); }
  "<"  { return (new Yytoken(55,yytext(),yyline,yychar,yychar+1)); }
 
  {INTEGER} { return (new Yytoken(70,yytext(),yyline,yychar,yychar+yylength())); }
  
  {IDENTIFIER} { return (new Yytoken(71,yytext(),yyline,yychar,yychar+yylength())); }
  
  {WHITESPACE}+  {}
}
